home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 09, No. 08 (1988-08)(MicroSPARC)(Side A).zip
/
Nibble Volume 09, No. 08 (1988-08)(MicroSPARC)(Side A).po
/
DATE.TIME.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
8KB
|
245 lines
*
* DATE.TIME Source Code
* by Royce Bacon
* Copyright(c) 1988
* MicroSPARC, Inc.
* Concord, MA 01742
*
COUT EQU $FDED ;OUTPUT A CHAR
PTR EQU $6 ;ADDR SAVE AREA
PTR19 EQU $19 ;ZERO PAGE PTR
PTR1B EQU $1B ;ZERO PAGE PTR
WK8 EQU $8 ;WORK AREA
RTRN EQU $FF58 ;RTS INSTRUCTION
STCK EQU $100 ;STACK
BUFIN EQU $200 ;INPUT BUFFER
SPACE EQU $A0
DATE EQU $BF90 ;DATE YYMMDD REVERSE SEQ
TIME EQU $BF92 ;TIME MIN, HR
CONVERT EQU $ED24 ;PRINT A/X AS DEC
PBITS EQU $BE54 ;PARSE BITS
XLEN EQU $BE52 ;LEN OF COMMAND
XCNUM EQU $BE53 ;EXTERNAL CMD FLAG
XTRNADDR EQU $BE50 ;EXTERNAL CMD ADDR
FBITS EQU $BE56 ;PARMS FOUND
MLI EQU $BF00 ;PRODOS MLI
VPATH1 EQU $BE6C ;--> TO PATH NAME
WAIT EQU $FCA8 ;MONITOR WAIT ROUTINE
SPKR EQU $C030 ;THIS CLICKS THE SPEAKER
MSB ON
ORG $9800
*
* DETERMINE OFFSET TO CMD TABLE
EXIT JMP $BE9E ;RETURN TO BASIC.SYSTEM
START JSR RTRN ;GET ADDR WE ARE AT
TSX ;GET STACK POINTER AS INDEX
DEX ;POINT TO LOW ORDER BYTE
LDA STCK,X ;GET LOW ORDER BYTE
CLC ;PREPARE FOR ADD
ADC #CMD-START-2 ;OFFSET FOR COMMNAD TABLE
STA PTR ;SAVE IT
INX ;POINT TO HIGH ORDER BYTE
LDA STCK,X ;AND GET IT
STA PTR+1 ;AND SAVE IT
LDY #0 ;INDEX FOR CMDS
* CHECK INPUT AGAINST COMMAND TABLE
CKCMD LDA BUFIN,Y ;GET CHAR OF INPUT
CMP #$8D ;END OF COMMAND?
BEQ GOTIT ;YES
CMP #SPACE ;END OF COMMAND?
BEQ GOTIT ;YES
CMP (PTR),Y ;MATCH COMMAND?
BNE TRYNEXT ;NO
INY ;YES - CHECK NEXT CHAR
BNE CKCMD
* TRY THE NEXT COMMAND IN THE TABLE
TRYNEXT LDA PTR ;GET --> TO CMD
CLC ;PREPARE FOR ADD
ADC #6 ;POINT TO NEXT CMD
STA PTR ;UPDATE POINTER
LDA (PTR),Y ;GET 1ST CHAR OF CMD
BNE CKCMD ;CHECK COMMAND IF NOT LAST
SEC ;INDICATE INVALID CMD
BEQ EXIT ;INVALID CMD
BNE EXIT
GOTIT LDA #$10 ;INDICATE FILENAME OPT
STA PBITS
LDA #0
STA PBITS+1
STA XCNUM ;INDICATE EXTERNAL CMD
LDY #3 ;LEN OF CMD - 1
STY XLEN
INY ;Y = 4
LDA (PTR),Y ;GET OFFSET OF CMD HANDLER
STA XTRNADDR
INY
LDA (PTR),Y ;HIGH ORDER BYTE
CLC
ADC PTR+1 ;ADD START OF RTN
STA XTRNADDR+1
CLC ;INDICATE VALID CMD
RTS ;LET BASIC.SYS PARSE CMD
*
* COMMAND TABLE
* BYTES 1-4 = COMMAND NAME
* 5-6 = OFFSET FOR ROUTINE TO HANDLE CMD
CMD ASC "DATE" ;COMMAND
DW DATERTN-EXIT ;--> DATE CMD
ASC "TIME" ;COMMAND
DW TIMERTN-EXIT ;--> TIME COMMAND
ASC "BELL" ;COMMAND
DW BELL-EXIT ;--> BELL COMMAND
DFB 0 ;END OF COMMANDS
*
* DISPLAY DATE ROUTINE
*
DATERTN JSR MLI ;CALL PRODOS MLI
DFB $82 ;TO GET TIME
DW 0 ;NO PARM LIST FOR GET.TIME
LDA DATE+1 ;GET 2ND BYTE OF DATE
LSR A ;SAVE BIT ZERO IN CARRY
LDA DATE ;GET 1ST BYTE OF DATE
ROR A ;SHIFT MONTH INTO
LSR A ; LOW ORDER
LSR A ; OF BYTE
LSR A
LSR A
TAX ;MOVE VALUE TO X
LDA #0 ;HIGH ORDER BYTE IS ZERO
JSR CONVERT ;AND CONVERT IT
LDA #'/'
JSR COUT ;PRINT /
LDA DATE ;GET FIRST BYTE OF DATE
AND #$1F ;ISOLATE DAY
TAX ;INTO X
LDA #0
JSR CONVERT ;CONVERT TO DEC
LDA #'/'
JSR COUT
LDA DATE+1
LSR A ;SHIFT YEAR TO LOW ORDER
TAX ;INTO X
LDA #0
JSR CONVERT ;AND CONVERT IT
CLC ;INDICATE NO ERRORS
RTS ;EXIT
*
* CONVERT INPUT FIELD TO HEX
*
CVINP TSX ;GET STACK PTR
DEX ;-> LOW ORDER BYTE
CLC
LDA STCK,X ;GET LOW ORDER BYTE
ADC #3 ;ADD FOR EXTRA INST
STA PTR19
INX ;HIGH ORDER BYTE
LDA STCK,X ;GET HIGH ORDER BYTE
ADC #0 ;ADD IN CARRY IF ANY
STA PTR19+1
LDA (PTR1B),Y ;GET CHAR
AND #$0F ;MAKE NUMERIC
STA WK8 ;SAVE IT
INY ;NEXT CHAR
LDA (PTR1B),Y ;GET NXT CHAR
CMP #$30 ;CHECK IF NUMERIC
BCC GOTVAL ;NO
CMP #$3A
BCS GOTVAL ;NO
LDA WK8 ;YES - GET 1ST DIGIT
ASL A ;MULTIPLY BY 2
ASL A ;4
ASL A ;8
CLC
ADC WK8 ;ADD TWICE
ADC WK8 ;TO MULTIPLY BY 10
STA WK8
LDA (PTR1B),Y ;GET 2ND CHAR
AND #$0F ;MAKE NUMERIC
CLC
ADC WK8 ;ADD 1ST DIGIT
STA WK8
INY ;POINT TO SEPERATOR
GOTVAL LDA PTR19+1 ;GET RETURN ADDR
PHA ;UNTO STACK
LDA PTR19
PHA
LDA WK8 ;RETURN VAL IN ACCUM
RTS ;EXIT
*
* TIME ROUTINES
*
TIMERTN LDA FBITS ;GET PARMS FOUND FLAG
BEQ SHOWTM ;NO PARMS
*
* SET TIME ROUTINE
*
SETTM LDA VPATH1 ;MOVE PATH NAME PTR
STA PTR1B ;TO ZERO PAGE
LDA VPATH1+1
STA PTR1B+1
LDY #2 ;--> TO HRS
JSR RTRN ;PUT RETURN ADDR ON STACK
CLV
BVC CVINP ;CONVERT HOURS TO HEX
STA TIME+1 ;STORE IN HOURS
INY ;BYPASS SEPERATOR
JSR RTRN
CLV
BVC CVINP ;CONVERT MINS TO HEX
STA TIME ;STORE IN MINUTES
* FALL THRU TO SHOW TIME
*
* DISPLAY TIME ROUTINE
*
SHOWTM JSR MLI ;CALL PRODOS MLI
DFB $82 ;TO GET TIME
DW 0 ;NO PARM LIST FOR GET.TIME
LDA TIME+1 ;GET HOUR
BEQ GR9
CMP #12 ;PM?
BCC ISAM ;NO
SBC #12 ;YES - SUBTRACT 12
BNE ISAM
GR9 LDA #12
ISAM TAX ;SAVE HOUR
LDA #0
JSR CONVERT ;AND CONVERT IT
LDA #':'
JSR COUT
LDX TIME ;GET MINUTES
CPX #10
BCS GT9
LDA #'0'
JSR COUT
GT9 LDA #0
JSR CONVERT ;PRINT MINUTES
LDA #SPACE
JSR COUT
LDA TIME+1 ;GET HOURS AGAIN
CMP #12 ;AM?
LDA #'A' ;ASSUME AM
BCC PRIT ;YES IT IS AM
LDA #'P' ;NO - PM
PRIT JSR COUT ;PRINT A OR P
LDA #'M'
JSR COUT
CLC ;INDICATE NO ERRORS
RTS
*
* BELL ROUTINE
* MAKES THE PRODOS RECOMMENDED TONE
*
BELL LDA #$20 ;DURATION OF TONE
STA WK8
BELL1 LDA #$2 ;SHORT DELAY
JSR WAIT
STA SPKR ;CLICK THE SPEAKER
LDA #$24 ;LONG DELAY
JSR WAIT
STA SPKR ;CLICK THE SPEAKER
DEC WK8
BNE BELL1 ;REPEAT LENGTH TIMES
CLC ;INDICATE NO ERRORS
RTS ;EXIT
* END